home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / bytjl86b.arc / UGHBUG.ASM < prev   
Assembly Source File  |  1985-07-12  |  32KB  |  1,567 lines

  1.     TITLE '    UGHBUG        VERSION 1.00        12 January 1986 '
  2.     SBTTL '    Copyright 1986 by George Dinwiddie '
  3.     PGLEN    55
  4.  
  5. ;    
  6. ;    NOTICE : This monitor program may be copied and distributed on the 
  7. ;    condition that all copyright notices and this notice remain intact.  
  8. ;    This program is provided without any warranty or assumption of 
  9. ;    liability whatsoever.  If it doesn't work or it breaks something, I'm
  10. ;    sorry, but it's not my problem.
  11. ;    
  12. ;    On the positive side, if this program helps you, I am glad to be of 
  13. ;    assistance.  I ask only two favors.  First, if you fix any bugs or 
  14. ;    add any enhancements, please send me a copy.  (CP/M 8" SSSD or IBM-PC
  15. ;    5.25" are best for me.)  Secondly, if you use this program to help 
  16. ;    develop a commercial product, please remember me.  As a suggestion, a
  17. ;    $50.00 donation would be a bargain for you and welcome by me.  If you
  18. ;    would prefer, either a sample of your product or a donation more in 
  19. ;    line with the profits on your product would be ok, too.  If you use 
  20. ;    this program on a home project, I understand that you can't alway 
  21. ;    afford to pay for the value of good software.  My own CP/M computer 
  22. ;    would be worthless without the wonderful public domain software that 
  23. ;    I have received for free.  If you want to send me your favorite 
  24. ;    public domain goody, great.  In any event, you are welcome to this --
  25. ;    enjoy, enjoy.
  26. ;    
  27. ;        George Dinwiddie
  28. ;        10965 Trotting Ridge Way
  29. ;        Columbia, MD  21044
  30. ;
  31. ;REVISION HISTORY :
  32. ;
  33. ;Version 1.00  George Dinwiddie  12 January 1986.
  34. ;    First public release.  Fixed GO-from-break bug.
  35. ;Version 0.16  George Dinwiddie  26 January 1984
  36. ;    Added JUMPTABLE and HEXMATH functions.
  37. ;
  38. ;WISH LIST :
  39. ;
  40. ;    Load command ('L') to load ram from a hex file through the terminal
  41. ;    port.
  42. ;
  43. ;    Find command ('F') to search for sequences specified in hex or 
  44. ;    ascii.  I always intended to add this one but never did.  That's 
  45. ;    the reason the Insert command isn't a Fill command.
  46. ;    
  47. ;    Disassemble command (maybe 'U' for Unassemble).
  48. ;    
  49. ;    Single-line assembler.  It's amazing how good you get at hand 
  50. ;    assembly when you practice.  Still, it would be nice to have this.
  51. ;
  52. ;
  53. ;NOTE : Some labels are of the following form :
  54. ;    IF000    == IF
  55. ;    THN000    == THEN
  56. ;    ELS000    == ELSE
  57. ;    NDI000    == ENDIF
  58. ;
  59.  
  60. MONBASE        EQU    0000H    ;4K MONITOR
  61. APPBASE        EQU    2000H    ;8K APPLICATION EPROM
  62. RAMBASE        EQU    4000H    ;8K RAM
  63. UARTBASE    EQU    7800H    ;TERMINAL (uart) LOCATION
  64. UARTDATA    EQU    UARTBASE ; C/D* = A0
  65. UARTCONT    EQU    (UARTBASE+1)
  66. RAMEND        EQU    5FFFH    ;END OF EXTERNAL RAMSPACE
  67. BYTENUM        EQU    (RAMEND-8) ;FROM HERE ON USED BY BREAK ROUTINE
  68. STACK        EQU    50H    ;stack begins here
  69.  
  70. PCON        EQU    87H    ;AVOCET ASSEMBLER DOESN'T KNOW PCON
  71.  
  72. ;reserved internal ram locations
  73. RESERVED    EQU    48H    ;reserved internal ram
  74. HIBYTE        EQU    RESERVED   ;TOP OF 16-BIT ADDRESS
  75. LOBYTE        EQU    RESERVED+1 ;BOTTOM OF 16 BIT ADDRESS
  76. FIRST        EQU    RESERVED+2 ;START ADDRESS HIGH (LOW IN RESERVED+3)
  77. LAST        EQU    RESERVED+4 ;END ADDRESS HIGH (LOW IN RESERVED+5)
  78. TO        EQU    RESERVED+6 ;TO ADDRESS HIGH (LOW IN RESERVED+7)
  79.  
  80. ;reserved register bank (and aliases for those registers)
  81. RESBANK        EQU    1    ;register bank 1
  82. REG0        EQU    8*RESBANK
  83. REG1        EQU    REG0+1    ;sometimes you can't use R1
  84. REG2        EQU    REG0+2
  85. REG3        EQU    REG0+3
  86. REG4        EQU    REG0+4
  87. REG5        EQU    REG0+5
  88. REG6        EQU    REG0+6
  89. REG7        EQU    REG0+7
  90.  
  91. ;character equates
  92. CR        EQU    0DH    ;CARRIAGE RETURN
  93. LF        EQU    0AH    ;LINE FEED
  94. SPACE        EQU    20H    ;SPACE CHARACTER
  95. TAB        EQU    09H    ;TAB CHARACTER
  96. DOT        EQU    2EH    ;PERIOD
  97. BACKSP        EQU    08H    ;BACKSPACE
  98. EOT        EQU    04H    ;end of text
  99.  
  100. ;***********************************************************
  101.  
  102.     ORG    MONBASE
  103. START:    JMP    UGHBUG
  104.  
  105.     ORG    START+03H
  106.     LJMP    RAMBASE+03H        ;INTERRUPT VECTORS JUMP TO RAM
  107.     ORG    START+0BH
  108.     LJMP    RAMBASE+0BH
  109.     ORG    START+13H
  110.     LJMP    RAMBASE+13H
  111.     ORG    START+1BH
  112.     LJMP    RAMBASE+1BH
  113.     ORG    START+23H
  114.     LJMP    RAMBASE+23H
  115.  
  116. ;*************************************************************
  117.  
  118. LJMPTBL:    LJMP    COOL
  119.     LJMP    WARM
  120.  
  121.     LJMP    IN
  122.     LJMP    INCH
  123.     LJMP    INHEX
  124.     LJMP    BYTES
  125.     LJMP    BADDR
  126.     LJMP    THRADR
  127.  
  128.     LJMP    OUT
  129.     LJMP    OUTCH
  130.     LJMP    OUTS
  131.     LJMP    OUT2S
  132.     LJMP    CRLF
  133.     LJMP    OUT2H
  134.     LJMP    OUTR0
  135.     LJMP    OUTC2HS
  136.     LJMP    PDATA
  137.  
  138.     LJMP    INC16
  139.     LJMP    DEC16
  140.     LJMP    CPY
  141.     LJMP    BRKPT
  142.     PAGE
  143. MSIGNON:
  144.     DB    CR, LF, 'Ughbug MCS-51 monitor, version 1.00'
  145.     DB    CR, LF, 'copyright 1986 by George Dinwiddie.', LF, 04H
  146. ;*************************************************************
  147.  
  148. UGHBUG:    MOV    SP,#STACK
  149.     MOV    STACK,SP    ;store stack pointer for cool start
  150.     SETB    RS0        ;SELECT REGISTER BANK 1
  151.     CLR    RS1
  152.     CLR    A
  153.     MOV    DPTR,#BYTENUM
  154.     MOV    R0,#(RAMEND-BYTENUM+1)
  155. CLEAR:    MOVX    @DPTR,A        ;clear space used by break routine
  156.     INC    DPTR
  157.     DJNZ    R0,CLEAR
  158. DLAY:    DJNZ    ACC,DLAY    ;WAIT HERE FOR UART TO WAKE-UP
  159.     DJNZ    R0,DLAY
  160.     MOV    DPTR,#UARTCONT    ;INIT UART
  161.     CLR    A
  162.     MOVX    @DPTR,A        ;send three zeros because you don't know
  163.     NOP            ;in what crazy mode the ugh-art wakes up
  164.     DJNZ    ACC,$-1
  165.     MOVX    @DPTR,A
  166.     NOP
  167.     DJNZ    ACC,$-1
  168.     MOVX    @DPTR,A
  169.     NOP
  170.     DJNZ    ACC,$-1
  171.     MOV    A,#40H        ;software reset uart
  172.     MOVX    @DPTR,A
  173.     CLR    A        ;many thanks to Ernest Penzenstadler
  174.     NOP            ;for taming the infamous 8251A ugh-art!
  175.     DJNZ    ACC,$-1
  176.     MOV    A,#01001110B    ;MODE
  177.     MOVX    @DPTR,A
  178.     MOVX    A,@DPTR        ;GET STATUS
  179.     JNB    ACC.0,$-1    ;WAIT FOR TXRDY
  180.     MOV    A,#00110111B    ;COMMAND
  181.     MOVX    @DPTR,A
  182.     MOV    DPTR,#MSIGNON
  183.     CALL    PDATA
  184. COOL:    MOV    SP,STACK
  185.  
  186. ;*************************************************************
  187.  
  188. WARM:
  189.     MOV    DPTR,#MPROMPT    ;WARM START
  190.     CALL    PDATA
  191.     CALL    INCH
  192.     JNB    ACC.6,$+5    ;JUMP IF NOT A LETTER
  193.     CLR    ACC.5        ;CONVERT LOWER TO UPPER CASE
  194.     MOV    R7,A        ;SAVE CHARACTER INPUT
  195.     MOV    DPTR,#FUNTAB    ;POINT TO FUNCTION TABLE
  196. SCAN:    CLR    A
  197.     MOVC    A,@A+DPTR
  198.     JZ    WARM        ;END OF TABLE
  199.     CJNE    A,0FH,NEXT    ;COMPARE WITH SAVED CHARACTER
  200.     MOV    A,#01H
  201.     MOVC    A,@A+DPTR    ;GET HIGH BYTE OF JUMP
  202.     MOV    R2,A        ;SAVE IN R2
  203.     MOV    A,#02H
  204.     MOVC    A,@A+DPTR    ;GET LOW BYTE OF JUMP
  205.     MOV    R3,A        ;SAVE IN R3
  206.     PUSH    REG3        ;PUSH R3 (LOW BYTE)
  207.     PUSH    REG2        ;PUSH R2 (HIGH BYTE)
  208.     RET            ;POP & JUMP
  209. NEXT:    INC    DPTR
  210.     INC    DPTR
  211.     INC    DPTR
  212.     JMP    SCAN
  213.  
  214.     PAGE
  215.  
  216. ;*************************************************************
  217.  
  218. HELP:
  219.     MOV    DPTR,#MHELP
  220.     CALL    PDATA
  221.     JMP    WARM
  222.  
  223. ;*************************************************************
  224.  
  225. DUMP:    CALL    BADDR
  226.     JNC    DMP3
  227.     CLR    ACC.5        ;CONVERT LOWER TO UPPER CASE
  228.     CJNE    A,#'I',DMP1
  229.     JMP    DUMPI        ;DUMP INTERNAL RAM
  230.  
  231. DMP1:    JMP    WARM
  232.  
  233. DMP3:    MOV    FIRST,HIBYTE    ;DUMP PROGRAM MEMORY
  234.     MOV    (FIRST+1),LOBYTE
  235.     MOV    LAST,#0FFH
  236.     MOV    (LAST+1),#0FFH
  237.     CJNE    A,#CR,DMP4    ;DEFAULT IF NO END ADDRESS ENTERED
  238.     JMP    (NEWLIN-6)
  239.  
  240. DMP4:    CALL    BADDR2
  241.     JB    F0,DMP5        ;CARRIAGE RETURN READ
  242.     MOV    LAST,HIBYTE
  243.     MOV    (LAST+1),LOBYTE
  244. DMP5:    MOV    DPTR,#MINDEX
  245.     LCALL    PDATA
  246. NEWLIN:
  247.     MOV    DPH,FIRST
  248.     MOV    DPL,(FIRST+1)
  249.     ANL    DPL,#0F0H
  250.     CALL    CRLF
  251.     MOV    R0,DPH
  252.     CALL    OUTR0        ;DISPLAY ADDRESS
  253.     MOV    R0,DPL
  254.     CALL    OUTR0
  255.     CALL    OUT2S
  256. SPACES:    MOV    A,(FIRST+1)    ;BLANK LOCATIONS BEFORE FIRST
  257.     XRL    A,DPL
  258.     JZ    MORE        ;JUMP IF EQUAL
  259.     CALL    OUT3S
  260.     INC    DPTR
  261.     CALL    MIDCHK
  262.     JMP    SPACES
  263.  
  264.  
  265. MORE:    CALL    OUTC2HS
  266.     MOV    A,LAST
  267.     CJNE    A,DPH,MOREC
  268.     MOV    A,(LAST+1)
  269.     CJNE    A,DPL,MOREC
  270.     JMP    ENDHEX
  271.  
  272. MOREC:    INC    DPTR
  273.     CALL    MIDCHK
  274.     JZ    DASCII        ;NOW DUMP ASCII
  275.     JMP    MORE
  276.  
  277. ENDHEX:    INC    DPTR
  278.     CALL    MIDCHK
  279.     JZ    DASCII        ;NOW DUMP ASCII (LAST LINE)
  280.     CALL    OUT3S
  281.     JMP    ENDHEX
  282.  
  283. DASCII:    CALL    OUT4S        ;SHOW ASCII EQUIVALENT
  284.     MOV    DPH,FIRST
  285.     MOV    DPL,(FIRST+1)
  286.     ANL    DPL,#0F0H
  287. DASCI1:    MOV    A,(FIRST+1)
  288.     XRL    A,DPL
  289.     JZ    DASCI2
  290.     CALL    OUTS
  291.     INC    DPTR
  292.     CALL    MIDCHK
  293.     JMP    DASCI1
  294.  
  295. DASCI2:    CLR    A
  296.     MOVC    A,@A+DPTR
  297.     MOV    B,A
  298.     CLR    C
  299.     SUBB    A,#SPACE
  300.     JC    BAD3
  301.     SUBB    A,#(7FH-SPACE)
  302.     JC    OK3
  303. BAD3:    MOV    B,#DOT
  304. OK3:    MOV    A,B
  305.     CALL    OUTCH
  306.  
  307.     MOV    A,LAST
  308.     CJNE    A,DPH,DASCI3
  309.     MOV    A,(LAST+1)
  310.     CJNE    A,DPL,DASCI3
  311.     JMP    WARM
  312.  
  313. DASCI3:    INC    DPTR
  314.     CALL    MIDCHK
  315.     JNZ    DASCI2
  316.     MOV    A,#16
  317.     ADD    A,(FIRST+1)
  318.     ANL    A,#0F0H
  319.     JNC    $+4
  320.     INC    FIRST
  321.     MOV    (FIRST+1),A
  322.     JMP    NEWLIN
  323.  
  324. ;*************************************************************
  325.  
  326. TABENT        EQU    11    ;LENGTH OF SFR TABLE ENTRY
  327. OFF1        EQU    6    ;OFFSET TO HEX ADDRESS
  328. OFF2        EQU    5    ;OFFSET TO FETCH CONTENTS
  329. OFF3        EQU    8    ;OFFSET TO CHANGE CONTENTS
  330.  
  331. DUMPI:
  332.     CALL    BADDR
  333.     JNC    $+5
  334.     LJMP    WARM
  335.  
  336.     MOV    FIRST,LOBYTE
  337.     MOV    LAST,#0FFH
  338.     XRL    A,#CR
  339.     JZ    (LINE-6)
  340.     CALL    BADDR2
  341.     JB    F0,$+6        ;CARRIAGE RETURN READ
  342.     MOV    LAST,LOBYTE
  343.     MOV    A,#7FH        ;TOP OF RAM
  344.     CLR    C
  345.     SUBB    A,FIRST
  346.     JC    DSFR        ;DONE RAM--DO SFR'S
  347.     MOV    DPTR,#MINDEX
  348.     LCALL    PDATA
  349. LINE:    CALL    CRLF
  350.     MOV    A,#7FH        ;TOP OF RAM
  351.     CLR    C
  352.     SUBB    A,FIRST
  353.     JC    DSFR        ;DONE RAM--DO SFR'S
  354.     MOV    R0,FIRST
  355.     ANL    REG0,#0F0H    ;8=R0
  356.     CALL    OUTR03S        ;DISPLAY ADDRESS
  357. SPICES:    MOV    A,FIRST        ;SPACES BEFORE BEGINNING
  358.     XRL    A,R0
  359.     JZ    NXTBYT
  360.     CALL    OUT3S
  361.     INC    R0
  362.     MOV    A,#07H
  363.     ANL    A,R0
  364.     JNZ    $+5
  365.     LCALL    OUTS        ;MIDDLE OF LINE
  366.     JMP    SPICES
  367.  
  368. NXTBYT:    CALL    OUT2H
  369.     CALL    OUTS
  370.     MOV    A,R0
  371.     XRL    A,LAST
  372.     JNZ    $+5
  373.     LJMP    WARM
  374.  
  375.     INC    R0
  376.     MOV    A,#07H
  377.     ANL    A,R0
  378.     JNZ    $+5
  379.     LCALL    OUTS        ;MIDDLE OF LINE
  380.     MOV    A,#0FH
  381.     ANL    A,R0
  382.     JNZ    NXTBYT        ;NOT END OF LINE
  383.     MOV    A,FIRST
  384.     ANL    A,#0F0H
  385.     ADD    A,#10H
  386.     MOV    FIRST,A
  387.     JMP    LINE
  388.  
  389. DSFR:    MOV    DPTR,#(SFRTAB-TABENT)
  390.     MOV    R1,#6
  391.     CALL    CRLF
  392. DSFR1:    MOV    A,#TABENT
  393.     ADD    A,DPL
  394.     MOV    DPL,A
  395.     JNC    $+4
  396.     INC    DPH
  397.     MOV    A,#OFF1        ;OFFSET TO SFR HEX LOCATION
  398.     MOVC    A,@A+DPTR
  399.     CLR    C
  400.     SUBB    A,FIRST
  401.     JC    DSFR1        ;NOT TO FIRST YET
  402.  
  403. DSFR5:    MOV    A,#OFF1
  404.     MOVC    A,@A+DPTR    ;GET HEX LOCATION OF SFR
  405.     MOV    R0,FIRST
  406.     XRL    A,R0
  407.     JZ    DSFR10
  408.     INC    FIRST        ;WASN'T A VALID SFR
  409.     MOV    A,FIRST
  410.     JZ    (LINE-6)    ;BACK TO RAM
  411.     CJNE    A,LAST,DSFR5
  412.     JMP    WARM        ;DONE
  413.  
  414. DSFR10:    CALL    OUTR0
  415.     MOV    A,#('=')
  416.     CALL    OUTCH
  417.     CALL    PDATA        ;OUTPUT LOCATION LABEL (ALTERS DPTR)
  418.     MOV    A,#(':')
  419.     CALL    OUTCH
  420.     MOV    A,#LOW(DSFR20)
  421.     PUSH    ACC
  422.     MOV    A,#HIGH(DSFR20)
  423.     PUSH    ACC
  424.     MOV    A,#(OFF2-4)    ;OFFSET TO "MOV    R0,SFR"
  425.     JMP    @A+DPTR
  426.  
  427. DSFR20:    CALL    OUTR0
  428.     CALL    OUT2S
  429.     DJNZ    R1,DSFR30
  430.     MOV    R1,#6
  431.     CALL    CRLF
  432. DSFR30:    INC    FIRST
  433.     MOV    A,#(TABENT-4)
  434.     ADD    A,DPL
  435.     MOV    DPL,A
  436.     JNC    $+4
  437.     INC    DPH
  438.     MOV    A,FIRST
  439.     JNZ    $+5
  440.     LJMP    LINE
  441.     DEC    A
  442.     XRL    A,LAST
  443.     JNZ    DSFR5
  444.     JMP    WARM
  445.  
  446.  
  447. ;*************************************************************
  448.  
  449. COPY:    CALL    THRADR
  450.     CALL    CPY
  451.     JMP    WARM
  452.  
  453. ;*************************************************************
  454.  
  455. VERIFY:    CALL    THRADR
  456. VER10:    MOV    DPH,FIRST
  457.     MOV    DPL,(FIRST+1)
  458.     CLR    A
  459.     MOVC    A,@A+DPTR
  460.     MOV    R1,A
  461.     MOV    DPH,TO
  462.     MOV    DPL,(TO+1)
  463.     CLR    A
  464.     MOVC    A,@A+DPTR
  465.     MOV    R2,A
  466.     XRL    A,R1
  467.     JZ    VER20        ;JUMP IF EQUAL
  468.     CALL    CRLF
  469.     MOV    R0,#FIRST
  470.     CALL    OUT2H
  471.     MOV    R0,#(FIRST+1)
  472.     CALL    OUT2H
  473.     CALL    OUT2S
  474.     MOV    R0,#REG1    ;R1
  475.     CALL    OUT2H
  476.     CALL    OUT4S
  477.     MOV    R0,#TO
  478.     CALL    OUT2H
  479.     MOV    R0,#(TO+1)
  480.     CALL    OUT2H
  481.     CALL    OUT2S
  482.     MOV    R0,#REG2    ;R2
  483.     CALL    OUT2H
  484. VER20:    MOV    A,FIRST
  485.     CJNE    A,LAST,VER30
  486.     MOV    A,(FIRST+1)
  487.     CJNE    A,(LAST+1),VER30
  488.     JMP    WARM
  489. VER30:    MOV    R0,#(FIRST+1)
  490.     CALL    INC16
  491.     MOV    R0,#(TO+1)
  492.     CALL    INC16
  493.     JMP    VER10
  494.  
  495. ;*************************************************************
  496.  
  497. ALTER:    CALL    BADDR
  498.     JNC    ALT05
  499.     JNB    F0,ALTEND    ;ERROR
  500.     CLR    ACC.5        ;CONVERT LOWER TO UPPER CASE
  501.     CJNE    A,#('I'),ALTEND    ;ERROR
  502.     JMP    SUBSTUT
  503.  
  504. ALT05:    MOV    FIRST,HIBYTE
  505.     MOV    (FIRST+1),LOBYTE
  506. ALT10:    CALL    CRLF
  507.     MOV    R0,#FIRST    ;SHOW ADDRESS
  508.     CALL    OUT2H
  509.     INC    R0
  510.     CALL    OUT2H
  511. ALT15:    CALL    OUTS
  512.     MOV    DPH,FIRST
  513.     MOV    DPL,(FIRST+1)
  514.     CLR    A
  515.     MOVC    A,@A+DPTR    ;GET DATA
  516.     MOV    R1,A
  517.     MOV    R0,#REG1    ;SHOW DATA
  518.     CALL    OUT2H
  519.     MOV    A,#('-')
  520.     CALL    OUTCH
  521.     CALL    BYTES
  522.     JNC    ALT20
  523.     XRL    A,#BACKSP
  524.     JZ    BACKUP
  525.     XRL    A,#BACKSP    ;RESTORE A
  526.     XRL    A,#DOT
  527.     JZ    BACKUP
  528. ALTEND:    JMP    WARM        ;ERROR
  529.  
  530. ALT20:    JB    F0,ALT30    ;<CR> OR SPACE
  531.     MOV    A,LOBYTE
  532.     MOVX    @DPTR,A        ;CHANGE DATA
  533. ALT30:    MOV    R0,#(FIRST+1)
  534.     CALL    INC16
  535.     MOV    A,B
  536.     XRL    A,#CR
  537.     JZ    ALT10
  538.     MOV    A,(FIRST+1)
  539.     ANL    A,#07H
  540.     JZ    ALT10
  541.     JMP    ALT15
  542.  
  543. BACKUP:    MOV    R0,#(FIRST+1)
  544.     CALL    DEC16
  545.     JMP    ALT10
  546.  
  547. ;*************************************************************
  548.  
  549. MODIFY    CALL    BADDR
  550.     MOV    DPH,HIBYTE
  551.     MOV    DPL,LOBYTE
  552. MOD10:    CALL    INCH
  553.     CJNE    A,#BACKSP,NOTBS
  554.     DEC    DPL
  555.     MOV    A,#0FFH
  556.     CJNE    A,DPL,MOD10
  557.     DEC    DPH
  558.     JMP    MOD10
  559.  
  560. NOTBS:    CJNE    A,#EOT,$+6
  561.     LJMP    WARM
  562.     MOVX    @DPTR,A
  563.     INC    DPTR
  564.     JMP    MOD10
  565.  
  566. ;*************************************************************
  567.  
  568. SUBSTUT:
  569.     CALL    BADDR
  570.     MOV    R0,LOBYTE
  571. IF010:    MOV    A,#7FH        ;IF ADDRESS >= 80H OR <= F0H
  572.     CLR    C
  573.     SUBB    A,R0
  574.     JNC    ELS010
  575.     MOV    A,#0F0H
  576.     CLR    C
  577.     SUBB    A,R0
  578.     JC    ELS010
  579. THN010:    MOV    DPTR,#(SFRTAB-TABENT)
  580. SUB60:    MOV    A,#TABENT    ;INCREMENT TABLE POINTER
  581.     ADD    A,DPL
  582.     MOV    DPL,A
  583.     JNC    $+4
  584.     INC    DPH
  585.     MOV    A,#OFF1        ;FIND 1ST ENTRY >= R0
  586.     MOVC    A,@A+DPTR
  587.     CLR    C
  588.     SUBB    A,R0
  589.     JC    SUB60        ;NOT FOUND YET
  590. SUB65:    MOV    A,#OFF1        ;INCREMENT R0 TO LINE IN TABLE
  591.     MOVC    A,@A+DPTR
  592.     XRL    A,R0
  593.     JZ    SUB70        ;FOUND IT
  594.     INC    R0
  595.     JMP    SUB65
  596.  
  597. ELS010:    JMP    LS010        ;RELAY STATION
  598.  
  599. SUB70:    CALL    CRLF        ;DISPLAY ADDRESS
  600.     CALL    OUTR03S
  601.     CALL    PDATA        ;ALTERS DPTR (ADDS 4)
  602.     MOV    A,#(':')
  603.     CALL    OUTCH
  604.     MOV    REG1,R0        ;MOV    R1,R0
  605.     MOV    A,#LOW(SUB80)
  606.     PUSH    ACC
  607.     MOV    A,#HIGH(SUB80)
  608.     PUSH    ACC
  609.     MOV    A,#(OFF2-4)
  610.     JMP    @A+DPTR        ;CRASHES R0
  611.  
  612. SUB80:    CALL    OUTR0        ;DISPLAY DATA
  613.     MOV    A,#('-')
  614.     CALL    OUTCH
  615.     MOV    R0,REG1        ;RESTORE R0
  616.     CALL    BYTES
  617. IF020:    JNC    ELS020        ;IF CHARACTER = DOT OR BACKSPACE
  618.     MOV    A,B
  619.     XRL    A,#BACKSP
  620.     JZ    THN020
  621.     MOV    A,B
  622.     XRL    A,#DOT
  623.     JZ    THN020
  624.     JMP    WARM        ;ERROR
  625.  
  626. THN020:                ;THEN BACKUP
  627. IF030:    CJNE    R0,#80H,ELS030
  628. THN030:    MOV    R0,#7FH
  629.     JMP    IF010
  630.  
  631. ELS030:    MOV    A,DPL
  632.     CLR    C
  633.     SUBB    A,#(TABENT+4)
  634.     MOV    DPL,A
  635.     JNC    $+4
  636.     DEC    DPH
  637.     MOV    A,#(OFF1)
  638.     MOVC    A,@A+DPTR
  639.     MOV    R0,A
  640.     JMP    IF010
  641.  
  642. ELS020:
  643.     JB    F0,SUB90
  644.     SETB    F0
  645.     MOV    R0,LOBYTE
  646.     MOV    A,#LOW(SUB90)
  647.     PUSH    ACC
  648.     MOV    A,#HIGH(SUB90)
  649.     PUSH    ACC
  650.     MOV    A,#(OFF3-4)
  651.     JMP    @A+DPTR        ;CRASHES R0
  652.  
  653. SUB90:    MOV    R0,REG1        ;RESTORE R0
  654. IF035:    JB    F0,NDI035
  655. THN035:    MOV    DPTR,#MNONO
  656.     CALL    PDATA
  657. NDI035:
  658. IF040:    CJNE    R0,#0F0H,NDI040    ;IF R0 = 0F
  659. THN040:    MOV    R0,#0FFH    ;THEN R0 = FFH
  660. NDI040:
  661.     INC    R0
  662.     JMP    IF010
  663.  
  664.  
  665. LS010:    CALL    CRLF
  666.     CALL    OUTR03S
  667. SUB20:    CALL    OUT2H
  668.     MOV    A,#('-')
  669.     CALL    OUTCH
  670.     MOV    REG1,R0
  671.     CALL    BYTES        ;clobbers r0
  672.     MOV    R0,REG1
  673. IF050:    JNC    ELS050        ;IF CHAR. = BACKSP. OR DOT
  674.     MOV    A,B
  675.     XRL    A,#BACKSP
  676.     JZ    THN050
  677.     MOV    A,B
  678.     XRL    A,#DOT
  679.     JZ    THN050
  680.     JMP    WARM
  681.  
  682. THN050:                ;THEN BACKUP
  683. IF060:    MOV    A,R0
  684.     JNZ    NDI060        ;IF R0 = 0
  685. THN060:    MOV    R0,#0F1H    ;THEN R0 = F1H
  686. NDI060:
  687. NDI050:
  688.     DEC    R0
  689. F010:    JMP    IF010        ;ALSO USED FOR RELAY
  690.  
  691. ELS050:
  692. IF070:    JB    F0,NDI070    ;IF NOT SPACE OR CR
  693. THN070:    MOV    A,LOBYTE    ;THEN CHANGE BYTE
  694.     MOV    @R0,A
  695. NDI070:    INC    R0
  696.     MOV    A,#07H
  697.     ANL    A,R0
  698.     JZ    F010
  699.     CALL    OUT2S
  700.     JMP    SUB20
  701. ;*************************************************************
  702.  
  703. INSERT:    CALL    THRADR
  704.     MOV    DPH,FIRST
  705.     MOV    DPL,(FIRST+1)
  706. INS10:    MOV    A,(TO+1)
  707.     MOVX    @DPTR,A
  708.     MOV    A,DPH
  709.     CJNE    A,LAST,INS20
  710.     MOV    A,DPL
  711.     CJNE    A,(LAST+1),INS20
  712.     JMP    WARM
  713.  
  714. INS20:    INC    DPTR
  715.     JMP    INS10
  716.  
  717. ;*************************************************************
  718.  
  719. BREAK:            ;  REMOVE OLD BREAKPOINT
  720.     MOV    DPTR,#BYTENUM
  721.     CLR    A
  722.     MOVC    A,@A+DPTR
  723.     MOV    R1,A        ;SAVE OLD BYTENUM IN R1
  724. IF100:    JZ    NDI100        ;IF THERE IS AN OLD BREAKPOINT
  725. THN100:    MOV    FIRST,#HIGH(BYTENUM+1)    ;THEN REMOVE IT
  726.     MOV    FIRST+1,#LOW(BYTENUM+1)
  727.     MOV    LAST,#HIGH(BYTENUM)
  728.     MOV    A,#LOW(BYTENUM)
  729.     ADD    A,R1        ;ADD OLD BYTENUM
  730.     MOV    LAST+1,A
  731.     JNC    $+4
  732.     INC    LAST
  733.     MOV    DPTR,#(RAMEND-1)
  734.     CLR    A
  735.     MOVC    A,@A+DPTR
  736.     MOV    TO,A
  737.     MOV    DPTR,#RAMEND
  738.     CLR    A
  739.     MOVC    A,@A+DPTR
  740.     CLR    C
  741.     SUBB    A,R1        ;SUBTRACT OLD BYTENUM
  742.     MOV    TO+1,A
  743.     JNC    $+4
  744.     DEC    T0
  745.     CALL    CPY
  746.     CLR    A        ;CLEAR END OF RAM
  747.     MOV    DPTR,#BYTENUM
  748.     MOV    R0,#(RAMEND-BYTENUM+1-3)    ;LEAVE JUMP INSTRUCTION
  749. CLEAR1:    MOVX    @DPTR,A
  750.     INC    DPTR
  751.     DJNZ    R0,CLEAR1
  752. NDI100:
  753.     CALL    BYTES        ;INSTALL NEW BREAKPOINT
  754. IF150:    JNC    NDI150        ;IF NOT VALID HEX
  755.     JMP    WARM        ;THEN END
  756.  
  757. NDI150:
  758. IF155:    JNB    F0,NDI155    ;IF CR
  759.     XRL    A,#SPACE
  760.     JZ    NDI100        ;AND NOT SPACE
  761.     JMP    WARM        ;THEN END
  762.  
  763. NDI155:    MOV    FIRST,HIBYTE
  764.     MOV    FIRST+1,LOBYTE
  765.     MOV    DPTR,#BYTENUM
  766.     MOV    A,#3        ;IN CASE OF DEFAULT
  767.     MOVX    @DPTR,A
  768.     MOV    R1,A        ;SAVE DEFAULT NEW BYTENUM
  769. IF160:    MOV    A,B
  770.     XRL    A,#CR
  771.     JZ    NDI160
  772. THN160:    CALL    INHEX        ;get BYTENUM
  773. IF170:    JNC    ELS170        ;if not valid hex
  774. THN170:    MOV    A,B        ;then check for space or CR
  775.     XRL    A,#SPACE
  776.     JZ    THN160
  777.     MOV    A,B
  778.     XRL    A,#CR
  779.     JZ    NDI170
  780.     MOV    DPTR,#BYTENUM
  781.     CLR    A
  782.     MOVX    @DPTR,A
  783.     JMP    WARM
  784.  
  785. ELS170:    MOV    DPTR,#BYTENUM    ;else accept only 3, 4 or 5
  786.     MOVX    @DPTR,A
  787.     MOV    R1,A        ;SAVE NEW BYTENUM
  788.     SUBB    A,#3
  789.     JC    BAD4
  790.     SUBB    A,#(6-3)
  791.     JNC    BAD4
  792.     JMP    NDI170
  793.  
  794. BAD4:    MOV    DPTR,#BYTENUM
  795.     CLR    A
  796.     MOVX    @DPTR,A
  797.     JMP    WARM
  798.  
  799. NDI170:
  800. NDI160:
  801.                 ;FIRST,FIRST+1 AND HIBYTE,LOBYTE
  802.                 ;  BOTH CONTAIN BREAK ADDRESS
  803.                 ;R1 CONTAINS NEW BYTENUM
  804.     MOV    DPTR,#(RAMEND-2)
  805.     MOV    A,#02H        ;"LJMP"
  806.     MOVX    @DPTR,A
  807.     MOV    A,FIRST+1
  808.     ADD    A,R1        ;ADD BYTENUM
  809.     MOV    LAST+1,A
  810.     MOV    DPTR,#RAMEND
  811.     MOVX    @DPTR,A
  812.     MOV    A,FIRST
  813.     JNC    $+3
  814.     INC    A
  815.     MOV    LAST,A
  816.     MOV    DPTR,#(RAMEND-1)
  817.     MOVX    @DPTR,A
  818.     MOV    R0,#(LAST+1)
  819.     CALL    DEC16        ;ADJUST (LAST,LAST+1)
  820.     MOV    TO,#HIGH(BYTENUM+1)
  821.     MOV    TO+1,#LOW(BYTENUM+1)
  822.     CALL    CPY        ;SAVE INSTRUCTIONS IN END OF RAM
  823.     MOV    DPL,LOBYTE
  824.     MOV    DPH,HIBYTE    ;INSERT JUMP TO BRKPT
  825.     MOV    A,#02H        ;"LJMP"
  826.     MOVX    @DPTR,A
  827.     INC    DPTR
  828.     MOV    A,#HIGH(BRKPT)
  829.     MOVX    @DPTR,A
  830.     INC    DPTR
  831.     MOV    A,#LOW(BRKPT)
  832.     MOVX    @DPTR,A
  833.     JMP    WARM
  834.  
  835. ;*************************************************************
  836.  
  837. BRKPT:    PUSH    ACC
  838.     PUSH    PSW
  839.     PUSH    B
  840.     PUSH    DPH
  841.     PUSH    DPL
  842.     MOV    STACK,SP    ;save current stack level for cool start
  843.     SETB    RS0        ;SELECT REGISTER BANK 1
  844.     CLR    RS1
  845.     MOV    DPTR,#MBRK1
  846.     CALL    PDATA
  847.     MOV    DPTR,#(BYTENUM)
  848.     CLR    A
  849.     MOVC    A,@A+DPTR
  850.     MOV    R0,A
  851.     MOV    DPTR,#(RAMEND)
  852.     CLR    A
  853.     MOVC    A,@A+DPTR
  854.     CLR    C
  855.     SUBB    A,R0
  856.     MOV    B,A
  857.     MOV    DPTR,#(RAMEND-1)
  858.     CLR    A
  859.     MOVC    A,@A+DPTR
  860.     MOV    R0,A
  861.     JNC    $+3
  862.     DEC    R0
  863.     CALL    OUTR0
  864.     MOV    R0,B
  865.     CALL    OUTR0
  866.     MOV    DPTR,#MBRK2
  867.     CALL    PDATA
  868.     MOV    A,STACK
  869.     CLR    C
  870.     SUBB    A,#4
  871.     MOV    R0,A
  872.     CALL    OUT2H
  873.     MOV    DPTR,#MBRK3
  874.     CALL    PDATA
  875.     INC    R0
  876.     CALL    OUT2H
  877.     MOV    DPTR,#MBRK4
  878.     CALL    PDATA
  879.     INC    R0
  880.     CALL    OUT2H
  881.     MOV    DPTR,#MBRK5
  882.     CALL    PDATA
  883.     INC    R0
  884.     CALL    OUT2H
  885.     INC    R0
  886.     CALL    OUT2H
  887.     MOV    DPTR,#MBRK6
  888.     CALL    PDATA
  889.     MOV    R0,#STACK
  890.     CALL    OUT2H
  891.     JMP    WARM
  892.  
  893. ;*************************************************************
  894.  
  895. GO:    CALL    BYTES
  896.     JNC    $+5
  897.     LJMP    WARM
  898.  
  899.     JNB    F0,GXXXX
  900.     CJNE    A,#CR,GO        ;LOOK AGAIN IF SPACE
  901.     MOV    HIBYTE,#HIGH(BYTENUM+1)
  902.     MOV    LOBYTE,#LOW(BYTENUM+1)
  903.     MOV    SP,STACK        ;restore stack if necessary
  904.     POP    DPL
  905.     POP    DPH
  906.     POP    B
  907.     POP    PSW
  908.     POP    ACC
  909. GXXXX:
  910.     PUSH    LOBYTE
  911.     PUSH    HIBYTE
  912.     RET
  913.  
  914. ;*************************************************************
  915.  
  916. HEXMATH:
  917.     CALL    BADDR
  918.     JNC    $+5
  919.     LJMP    WARM
  920.  
  921.     MOV    FIRST,HIBYTE
  922.     MOV    (FIRST+1),LOBYTE
  923.     CALL    BADDR
  924.     JNC    $+5
  925.     LJMP    WARM
  926.  
  927.     MOV    A,(FIRST+1)
  928.     ADD    A,LOBYTE
  929.     MOV    (LAST+1),A    ;STORE LOW BYTE OF SUM
  930.     MOV    A,FIRST
  931.     ADDC    A,HIBYTE
  932.     MOV    LAST,A        ;STORE HIGH BYTE OF SUM
  933.  
  934.     MOV    A,(FIRST+1)
  935.     CLR    C
  936.     SUBB    A,LOBYTE
  937.     MOV    (TO+1),A    ;STORE LOW BYTE OF DIFFERENCE
  938.     MOV    A,FIRST
  939.     SUBB    A,HIBYTE
  940.     MOV    TO,A        ;STORE HIGH BYTE OF DIFFERENCE
  941.     CALL    CRLF
  942.     MOV    R0,#FIRST    ;POINT TO ADDEND
  943.     CALL    OUT4HS
  944.     MOV    A,#'+'
  945.     CALL    OUTCH
  946.     CALL    OUTS
  947.     MOV    R0,#HIBYTE    ;POINT TO AUGEND
  948.     CALL    OUT4HS
  949.     MOV    A,#'='
  950.     CALL    OUTCH
  951.     CALL    OUTS
  952.     MOV    R0,#LAST    ;POINT TO SUM
  953.     CALL    OUT4HS
  954.     CALL    CRLF
  955.     MOV    R0,#FIRST    ;POINT TO SUBTRAHEND
  956.     CALL    OUT4HS
  957.     MOV    A,#'-'
  958.     CALL    OUTCH
  959.     CALL    OUTS
  960.     MOV    R0,#HIBYTE    ;POINT TO MINUEND
  961.     CALL    OUT4HS
  962.     MOV    A,#'='
  963.     CALL    OUTCH
  964.     CALL    OUTS
  965.     MOV    R0,#TO        ;POINT TO DIFFERENCE
  966.     CALL    OUT4HS
  967.     JMP    WARM
  968.  
  969. ;*************************************************************
  970.  
  971. JUMPTABL:
  972.     MOV    DPTR,#MJUMP
  973.     CALL    PDATA
  974.     JMP    WARM
  975.  
  976.     PAGE
  977. ;*************************************************************
  978. ;
  979. ;ROUTINE    PDATA
  980. ;    WRITES A MESSAGE TO THE TERMINAL
  981. ;    ENTER WITH DPTR POINTING TO BEGINNING OF MESSAGE
  982. ;    AND 04H AT END OF MESSAGE.
  983. ;
  984. PDATA1:    CALL    OUTCH
  985.     INC    DPTR
  986. PDATA:    CLR    A
  987.     MOVC    A,@A+DPTR
  988.     CJNE    A,#EOT,PDATA1
  989.     RET
  990.  
  991. ;*************************************************************
  992. ;
  993. ;ROUTINE    IN
  994. ;    READ AN 8-BIT CHAR FROM 8251A UART
  995. ;
  996. IN:    PUSH    DPH
  997.     PUSH    DPL
  998.     MOV    DPTR,#UARTCONT
  999.     MOVX    A,@DPTR
  1000.     JNB    ACC.1,$-1    ;WAIT FOR RX RDY
  1001.     DEC    DPL        ;POINT TO DATA REGISTER
  1002.     MOVX    A,@DPTR
  1003.     POP    DPL
  1004.     POP    DPH
  1005.     RET
  1006.  
  1007. ;*************************************************************
  1008. ;
  1009. ;ROUTINE    INCH
  1010. ;    READ A CHARACTER, ZERO HIGH BIT, & ECHO BACK TO TERMINAL
  1011. ;
  1012. INCH:    CALL    IN        ;READ 8-BIT CHAR.
  1013.     ANL    A,#7FH        ;ZERO HIGH BIT
  1014.     JMP    OUT        ;ECHO BACK
  1015.  
  1016. ;*************************************************************
  1017. ;
  1018. ;ROUTINE    OUTCH
  1019. ;    OUTPUT A CHARACTER
  1020. ;
  1021. OUTCH:    CALL    OUT
  1022.     JNC    NOINPU        ;TEST FOR INPUT DURING OUTPUT
  1023.     CALL    IN        ;GET RID OF THE CHARACTER
  1024.     JMP    COOL        ;RESET STACK POINTER
  1025.  
  1026. NOINPU:    RET
  1027.  
  1028. ;*************************************************************
  1029. ;
  1030. ;ROUTINE    OUT
  1031. ;    SEND "A" REGISTER TO UART
  1032. ;    SET CARRY IF RX BUFFER IS FULL
  1033. ;
  1034. OUT:    PUSH    DPH
  1035.     PUSH    DPL
  1036.     PUSH    ACC        ;SAVE OUTPUT BYTE
  1037.     MOV    DPTR,#UARTCONT
  1038.     MOVX    A,@DPTR
  1039.     JNB    ACC.0,$-1    ;WAIT FOR TX EMPTY
  1040.     MOV    C,ACC.1        ;MOV RX RDY TO CARRY
  1041.     DEC    DPL        ;POINT TO DATA REGISTER
  1042.     POP    ACC        ;RESTORE OUTPUT BYTE
  1043.     MOVX    @DPTR,A        ;AND OUTPUT IT
  1044.     POP    DPL
  1045.     POP    DPH
  1046.     RET
  1047.  
  1048.     PAGE    30
  1049. ;*************************************************************
  1050. ;
  1051. ;ROUTINE    INHEX
  1052. ;    READS 1 ASCII HEX CHAR, CONVERTS TO BINARY IN ACC. &
  1053. ;    STORES ORIGINAL CHAR IN B REG.
  1054. ;    CARRY SET IF NOT VALID HEX, CLEARED OTHERWISE.
  1055. ;
  1056. INHEX:    CALL    INCH        ;GET CHARACTER
  1057.     MOV    B,A        ;STORE IN B
  1058.     CJNE    A,#CR,NOTCR    ;IF <CR> SEND <LF> ALSO
  1059.     MOV    A,#LF
  1060.     CALL    OUTCH
  1061. NOTCR:    MOV    A,B        ;RESTORE CHARACTER
  1062.     JNB    ACC.6,$+5    ;IF LOWER CASE
  1063.     CLR    ACC.5        ;CONVERT TO UPPER CASE
  1064.     CLR    C
  1065.     SUBB    A,#'0'
  1066.     JC    BAD        ; ACC < '0'
  1067.     SUBB    A,#10
  1068.     JNC    $+7        ; ACC > '9'
  1069.     ADD    A,#10    ;RESTORE
  1070.     LJMP    GOOD        ; '0' <= ACC <= '9'
  1071.  
  1072.     ADD    A,#('0'+10-'A'+10)    ;CORRECT FOR (-'0'-10) & MAP 'A' INTO 10
  1073.     JB    ACC.7,BAD    ; '9' < ACC < 'A'
  1074.     CLR    C
  1075.     SUBB    A,#16
  1076.     JNC    BAD        ; ACC > 'F'
  1077.     ADD    A,#16
  1078. GOOD:    CLR    C
  1079.     RET
  1080. BAD:    SETB    C
  1081.     RET
  1082.  
  1083. ;*************************************************************
  1084. ;
  1085. ;ROUTINE    BYTES
  1086. ;    READ IN TWO BYTE HEX NUMBER TO HIBYTE,LOBYTE
  1087. ;    LAST CHARACTER READ RETURNED IN B REGISTER
  1088. ;
  1089. ;    ERROR CODES:              CARRY:    F0:
  1090. ;    LEADING <CR> OR SPACE        0    1    (CHAR IN ACC)
  1091. ;    LEADING NONHEX CHARACTER    1    1    (CHAR IN ACC)
  1092. ;    OTHER NONHEX CHARACTER        1    0    (CHAR IN ACC)
  1093. ;
  1094. BYTES:    SETB    F0        ;NO HEX READ YET
  1095.     CLR    A
  1096.     MOV    HIBYTE,A
  1097.     MOV    LOBYTE,A
  1098. MORE1:    CALL    INHEX
  1099.     JNC    OK1        ;JUMP IF HEX DIGIT
  1100.     MOV    A,B        ;LOOK AT ASCII
  1101.     CJNE    A,#CR,$+6
  1102.     LJMP    CR1
  1103.  
  1104.     CJNE    A,#SPACE,BAD1
  1105. CR1:    CLR    C
  1106.     RET
  1107.  
  1108. OK1:    CLR    F0
  1109.     MOV    R0,#LOBYTE    ;POINTER
  1110.     XCHD    A,@R0        ;PUT 0 DIGIT IN LOW END OF LOBYTE
  1111.     SWAP    A        ;ACC NOW HAS DIGIT 1 IN HIGH END
  1112.     XCHD    A,@R0        ;ACC NOW HAS DIGITS 1,0
  1113.     XCH    A,@R0        ;ACC HAS DIGITS 2,X;LOBYTE DONE.
  1114.     DEC    R0        ;POINT TO HIBYTE
  1115.     XCHD    A,@R0        ;ACC NOW HAS DIGITS 2,3
  1116.     SWAP    A        ;ACC HAS DIGITS 3,2
  1117.     XCH    A,@R0        ;HIBYTE DONE
  1118.     JMP    MORE1        ;LOOK FOR ANOTHER DIGIT
  1119.  
  1120. BAD1:    SETB    C
  1121.     RET
  1122.  
  1123.     PAGE    19
  1124. ;*************************************************************
  1125. ;
  1126. ;ROUTINE    BUILD ADDRESS
  1127. ;    READ IN A 16-BIT HEX NUMBER TO HIBYTE,LOBYTE.
  1128. ;    RETURNS WITH CARRY & F0 SET IF A SECOND COMMAND CHARACTER
  1129. ;    IS FOUND.  CHARACTER WILL BE IN ACCUMULATOR.
  1130. ;    RETURNS WITH CARRY SET AND F0 CLEAR IF NON-HEX.
  1131. ;
  1132. BADDR:    CALL    BYTES
  1133.     JNC    ADDROK
  1134.     JB    F0,ADDRNOK    ;SECOND COMMAND CHARACTER
  1135.     JMP    WARM        ;ERROR
  1136. ADDROK:    JB    F0,BADDR    ;LEADING SPACE OR CR
  1137. ADDRNOK:
  1138.     RET
  1139.  
  1140. ;*************************************************************
  1141. ;
  1142. ;ROUTINE    BUILD ADDRESS #2
  1143. ;    READ IN A 16-BIT HEX NUMBER TO HIBYTE,LOBYTE.
  1144. ;    IGNORES LEADING SPACES.  RETURNS WITH F0 SET IF
  1145. ;    A LEADING CARRIAGE RETURN IS FOUND.
  1146. ;
  1147. BADDR2:    CALL    BYTES
  1148.     JNC    $+5
  1149.     LJMP    WARM        ;NON-HEX
  1150.  
  1151.     JNB    F0,ADDROK2    ;NUMBER READ
  1152.     CJNE    A,#CR,BADDR2    ;IGNORE LEADING SPACE
  1153. ADDROK2:
  1154.     RET
  1155.  
  1156. ;*************************************************************
  1157. ;
  1158. ;ROUTINE    OUTPUT SPACES
  1159. ;    OUTPUTS 1, 2, 3, OR 4 SPACES
  1160. ;
  1161. OUT4S:    CALL    OUTS
  1162. OUT3S:    CALL    OUTS
  1163. OUT2S:    CALL    OUTS
  1164. OUTS:    MOV    A,#SPACE
  1165.     JMP    OUTCH
  1166.  
  1167. ;*************************************************************
  1168. ;
  1169. ;ROUTINE    OUTPUT CODE, TWO HEX, SPACE
  1170. ;    OUTPUTS PROGRAM MEMORY BYTE POINTED OUT BY DPTR
  1171. ;    AS TWO ASCII CHARACTERS FOLLOWED BY A SPACE.
  1172. ;    USES B REGISTER AS TEMP. STORE
  1173. ;
  1174. OUTC2HS:
  1175.     CLR    A
  1176.     MOVC    A,@A+DPTR
  1177.     MOV    B,A        ;TEMP STORE
  1178.     CALL    OUTHL
  1179.     MOV    A,B
  1180.     CALL    OUTHR
  1181.     JMP    OUTS
  1182.  
  1183. ;*************************************************************
  1184. ;
  1185. ;ROUTINE    MIDCHK
  1186. ;    INSERTS A SPACE IF LOW NYBBLE OF DPTR = 8.
  1187. ;    RETURNS WITH LOW NYBBLE IN ACC.
  1188. ;    DESTROYS B REGISTER.
  1189. ;
  1190. MIDCHK:    MOV    A,DPL
  1191.     ANL    A,#0FH
  1192.     XRL    A,#08H
  1193.     JNZ    NOTMID
  1194.     XCH    A,B
  1195.     CALL    OUTS
  1196.     XCH    A,B
  1197. NOTMID:    XRL    A,#08H        ;RESTORE A
  1198.     RET
  1199.  
  1200.     PAGE    14
  1201. ;*************************************************************
  1202. ;
  1203. ;ROUTINES    OUTPUT HEX LEFT
  1204. ;        OUTPUT HEX RIGHT
  1205. ;    CONVERTS A NYBBLE IN ACC. TO ASCII AND SENDS IT
  1206. ;
  1207. OUTHL:    SWAP    A
  1208. OUTHR:    ANL    A,#0FH
  1209.     JNB    ACC.3,H2    ;<8
  1210.     JB    ACC.2,H1    ;>=C
  1211.     JNB    ACC.1,H2    ;<A
  1212. H1:    ADD    A,#07H
  1213. H2:    ADD    A,#('0')    ;CONVERT TO ASCII
  1214.     JMP    OUTCH
  1215.  
  1216.     PAGE    9
  1217. ;*************************************************************
  1218. ;
  1219. ;ROUTINE    OUTPUT TWO HEX
  1220. ;    OUTPUTS    HEX CONTENTS OF LOCATION POINTED OUT BY R0
  1221. ;
  1222. OUT2H:    MOV    A,@R0
  1223.     CALL    OUTHL
  1224.     MOV    A,@R0
  1225.     JMP    OUTHR
  1226.  
  1227. ;*************************************************************
  1228. ;
  1229. ;ROUTINE    CRLF
  1230. ;    SENDS A CARRIAGE RETURN AND A LINE FEED
  1231. ;
  1232. CRLF:    MOV    A,#CR
  1233.     CALL    OUTCH
  1234.     MOV    A,#LF
  1235.     JMP    OUTCH
  1236.  
  1237. ;*************************************************************
  1238. ;
  1239. ;ROUTINE    DECREMENT 16
  1240. ;    DECREMENTS A 16-BIT NUMBER POINTED OUT BY R0.
  1241. ;    ENTER WITH LOW BYTE @R0 & HIGH BYTE @(R0-1).
  1242. ;    CARRY SET ON OVERFLOW, CLEARED OTHERWISE.
  1243. ;
  1244. DEC16:    CLR    C
  1245.     DEC    @R0
  1246.     MOV    A,@R0
  1247.     CPL    A
  1248.     JNZ    DECEND
  1249.     DEC    R0
  1250.     DEC    @R0
  1251.     MOV    A,@R0
  1252.     CPL    A
  1253.     JNZ    DECEND
  1254.     SETB    C
  1255. DECEND:    RET
  1256.  
  1257.     PAGE    17
  1258. ;*************************************************************
  1259. ;
  1260. ;ROUTINE    INCREMENT 16
  1261. ;    INCREMENTS A 16-BIT NUMBER POINTED OUT BY R0.
  1262. ;    ENTER WITH LOW BYTE @R0 & HIGH BYTE @(R0-1).
  1263. ;    CARRY SET ON OVERFLOW, CLEARED OTHERWISE.
  1264. ;
  1265. INC16:    CLR    C
  1266.     INC    @R0
  1267.     MOV    A,@R0
  1268.     JNZ    INCEND
  1269.     DEC    R0
  1270.     INC    @R0
  1271.     MOV    A,@R0
  1272.     JNZ    INCEND
  1273.     SETB    C
  1274. INCEND:    RET
  1275.  
  1276.     PAGE    20
  1277. ;*************************************************************
  1278. ;
  1279. ;ROUTINE    THREE ADRESSES
  1280. ;    GETS THREE 16-BIT HEX NUMBERS AND STORES THEM IN
  1281. ;    "FIRST", "LAST", AND "TO" RESPECTIVELY.
  1282. ;
  1283. THRADR:    CALL    BADDR
  1284.     JC    THRERR
  1285.     MOV    FIRST,HIBYTE
  1286.     MOV    (FIRST+1),LOBYTE
  1287.     CALL    BADDR
  1288.     JC    THRERR
  1289.     MOV    LAST,HIBYTE
  1290.     MOV    (LAST+1),LOBYTE
  1291.     CALL    BADDR
  1292.     JC    THRERR
  1293.     MOV    TO,HIBYTE
  1294.     MOV    (TO+1),LOBYTE
  1295.     RET
  1296. THRERR:    JMP    COOL
  1297.  
  1298. ;*************************************************************
  1299. ;
  1300. ;ROUTINE    COPY
  1301. ;    COPIES PROGRAM MEMORY LOCATED "FIRST" TO "LAST"
  1302. ;    TO RAM LOCATION STARTING AT "TO"
  1303. ;
  1304. CPY:    MOV    DPH,FIRST
  1305.     MOV    DPL,(FIRST+1)
  1306.     CLR    A
  1307.     MOVC    A,@A+DPTR
  1308.     MOV    DPH,TO
  1309.     MOV    DPL,(TO+1)
  1310.     MOVX    @DPTR,A        ;PUT DATA
  1311.     MOV    A,FIRST
  1312.     CJNE    A,LAST,CPY2
  1313.     MOV    A,(FIRST+1)
  1314.     CJNE    A,(LAST+1),CPY2
  1315.     RET            ;DONE
  1316.  
  1317. CPY2:    MOV    R0,#(FIRST+1)
  1318.     CALL    INC16
  1319.     MOV    R0,#(TO+1)
  1320.     CALL    INC16
  1321.     JMP    CPY
  1322.  
  1323. ;*************************************************************
  1324. ;
  1325. ;ROUTINE    OUT, 2 HEX, 3 SPACES
  1326. ;    OUTPUTS LOCATION POINTED OUT BY R0 FOLLOWED BY 3 SPACES
  1327. ;
  1328. OUT2H3S:
  1329.     CALL    OUT2H
  1330.     JMP    OUT3S
  1331.  
  1332.     PAGE    11
  1333. ;*************************************************************
  1334. ;
  1335. ;ROUTINE    OUTPUT R0
  1336. ;    OUTPUTS THE CONTENTS OF R0
  1337. ;    (8051 CAN'T ACCESS SFR'S INDIRECTLY--UGH)
  1338. ;
  1339. OUTR0:    MOV    A,R0
  1340.     CALL    OUTHL
  1341.     MOV    A,R0
  1342.     JMP    OUTHR
  1343.  
  1344.     PAGE    9
  1345. ;*************************************************************
  1346. ;
  1347. ;ROUTINE    OUTPUT R0, 3 SPACES
  1348. ;    OUTPUTS THE CONTENTS OF R0 AND THREE SPACES
  1349. ;
  1350. OUTR03S:
  1351.     CALL    OUTR0
  1352.     JMP    OUT3S
  1353.  
  1354. ;*************************************************************
  1355. ;
  1356. ;ROUTINE    OUTPUT FOUR HEX, SPACE
  1357. ;
  1358. ;    OUTPUTS TWO CONSECUTIVE INTERNAL MEMORY LOCATIONS,
  1359. ;    THE LOWER OF WHICH (HIGH BYTE OF NUMBER) IS POINTED
  1360. ;    OUT BY R0.
  1361. ;
  1362. OUT4HS:    CALL    OUT2H
  1363.     INC    R0
  1364.     CALL    OUT2H
  1365.     JMP    OUTS
  1366.  
  1367.     PAGE
  1368. ;*************************************************************
  1369.  
  1370. FUNTAB:            ;FUNCTION TABLE
  1371.     DB    'A'
  1372.     DW    ALTER
  1373.     DB    'B'
  1374.     DW    BREAK
  1375.     DB    'C'
  1376.     DW    COPY
  1377.     DB    'D'
  1378.     DW    DUMP
  1379.     DB    'G'
  1380.     DW    GO
  1381.     DB    'H'
  1382.     DW    HELP
  1383.     DB    'I'
  1384.     DW    INSERT
  1385.     DB    'J'
  1386.     DW    JUMPTABL
  1387.     DB    'M'
  1388.     DW    MODIFY
  1389.     DB    'V'
  1390.     DW    VERIFY
  1391.     DB    '#'
  1392.     DW    HEXMATH
  1393.     DB    00H    ;END OF TABLE
  1394.  
  1395. ;*************************************************************
  1396.  
  1397. SFRTAB:                ;SPECIAL FUNCTION REGISTER TABLE
  1398.     DB    'P0  ',04H
  1399.     MOV    R0,P0  
  1400.     RET
  1401.     CLR    F0
  1402.     RET
  1403.     DB    'SP  ',04H
  1404.     MOV    R0,SP  
  1405.     RET
  1406.     CLR    F0
  1407.     RET
  1408.     DB    'DPL ',04H
  1409.     MOV    R0,DPL 
  1410.     RET
  1411.     MOV    DPL,R0
  1412.     RET
  1413.     DB    'DPH ',04H
  1414.     MOV    R0,DPH 
  1415.     RET
  1416.     MOV    DPL,R0
  1417.     RET
  1418.     DB    'PCON',04H
  1419.     MOV    R0,PCON
  1420.     RET
  1421.     MOV    PCON,R0
  1422.     RET
  1423.     DB    'TCON',04H
  1424.     MOV    R0,TCON
  1425.     RET
  1426.     MOV    TCON,R0
  1427.     RET
  1428.     DB    'TMOD',04H
  1429.     MOV    R0,TMOD
  1430.     RET
  1431.     MOV    TMOD,R0
  1432.     RET
  1433.     DB    'TL0 ',04H
  1434.     MOV    R0,TL0 
  1435.     RET
  1436.     MOV    TL0,R0
  1437.     RET
  1438.     DB    'TL1 ',04H
  1439.     MOV    R0,TL1 
  1440.     RET
  1441.     MOV    TL1,R0
  1442.     RET
  1443.     DB    'TH0 ',04H
  1444.     MOV    R0,TH0 
  1445.     RET
  1446.     MOV    TH0,R0
  1447.     RET
  1448.     DB    'TH1 ',04H
  1449.     MOV    R0,TH1 
  1450.     RET
  1451.     MOV    TH1,R0
  1452.     RET
  1453.     DB    'P1  ',04H
  1454.     MOV    R0,P1  
  1455.     RET
  1456.     MOV    P1,R0
  1457.     RET
  1458.     DB    'SCON',04H
  1459.     MOV    R0,SCON
  1460.     RET
  1461.     MOV    SCON,R0
  1462.     RET
  1463.     DB    'SBUF',04H
  1464.     MOV    R0,SBUF
  1465.     RET
  1466.     MOV    SBUF,R0
  1467.     RET
  1468.     DB    'P2  ',04H
  1469.     MOV    R0,P2  
  1470.     RET
  1471.     CLR    F0
  1472.     RET
  1473.     DB    'IE  ',04H
  1474.     MOV    R0,IE  
  1475.     RET
  1476.     MOV    IE,R0
  1477.     RET
  1478.     DB    'P3  ',04H
  1479.     MOV    R0,P3  
  1480.     RET
  1481.     MOV    P3,R0
  1482.     RET
  1483.     DB    'IP  ',04H
  1484.     MOV    R0,IP  
  1485.     RET
  1486.     MOV    IP,R0
  1487.     RET
  1488.     DB    'PSW ',04H
  1489.     MOV    R0,PSW 
  1490.     RET
  1491.     MOV    PSW,R0
  1492.     RET
  1493.     DB    'ACC ',04H
  1494.     MOV    R0,ACC 
  1495.     RET
  1496.     MOV    ACC,R0
  1497.     RET
  1498.     DB    'B   ',04H
  1499.     MOV    R0,B   
  1500.     RET
  1501.     MOV    B,R0
  1502.     RET
  1503.  
  1504. ;*************************************************************
  1505.  
  1506. MPROMPT:
  1507.     DB    CR,LF,'UGH:',04H
  1508.  
  1509. MHELP:    DB    CR,LF,'REGISTER BANK 1 IS RESERVED'
  1510.     DB    CR,LF,'LAST 9 BYTES OF EXT. RAM USED BY BREAK ROUTINE'
  1511.     DB    CR,LF,'RAM @ 48H-50H IS USED BY MONITOR'
  1512.     DB    CR,LF,'RAM ABOVE 50H IS USED FOR STACK',LF
  1513.     DB    CR,LF,'COMMANDS ARE',LF
  1514.     DB    CR,LF,'A SSSS',TAB,TAB,TAB,'ALTER EXTERNAL MEMORY'
  1515.     DB    CR,LF,'AI SS',TAB,TAB,TAB,'ALTER INTERNAL MEMORY'
  1516.     DB    CR,LF,'B {AAAA {#}}',TAB,TAB,'BREAK @ AAAA (#=3,4,OR 5)
  1517.     DB    CR,LF,'C SSSS FFFF TTTT',TAB,'COPY BLOCK OF MEMORY'
  1518.     DB    CR,LF,'D SSSS {FFFF}',TAB,TAB,'DUMP PROGRAM MEMORY'
  1519.     DB    CR,LF,'DI SS {FF}',TAB,TAB,'DUMP INTERNAL MEMORY'
  1520.     DB    CR,LF,'G {AAAA}',TAB,TAB,'GO @ AAAA OR BREAKPOINT'
  1521.     DB    CR,LF,'H',TAB,TAB,TAB,'HELP'
  1522.     DB    CR,LF,'I SSSS FFFF HH',TAB,TAB,'INSERT "HH" INTO MEMORY'
  1523.     DB    CR,LF,'J', TAB, TAB,TAB, 'LIST JUMP TABLE'
  1524.     DB    CR,LF,'M SSSS',TAB,TAB,TAB,'MODIFY EXTERNAL MEMORY (ASCII)'
  1525.     DB    CR,LF,'V SSSS FFFF TTTT',TAB,'VERIFY MEMORY'
  1526.     DB    CR,LF,'# MMMM NNNN ',TAB,TAB,'HEX ADDITION & SUBTRACTION'
  1527.     DB    CR,LF,04H
  1528.  
  1529. MBRK1:    DB    CR,LF,'BREAK AT LOCATION ',04H
  1530. MBRK2:    DB    CR,LF,'ACC = ',04H
  1531. MBRK3:    DB    '    PSW = ',04H
  1532. MBRK4:    DB    '    B = ',04H
  1533. MBRK5:    DB    '    DPTR = ',04H
  1534. MBRK6:    DB    '    SP = ',04H
  1535.  
  1536. MINDEX:    DB    CR,LF,'      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F',04H
  1537.  
  1538. MNONO:    DB    CR,LF,'OOPS, THAT',27H,'S A NO-NO !',04H
  1539.  
  1540. MJUMP:
  1541.     DB    CR,LF, '0026    COOL',TAB, 'COOL START (RESET STACK POINTER)'
  1542.     DB    CR,LF, '0029    WARM',TAB, 'WARM START'
  1543.     DB    CR,LF, '002C    IN',TAB, 'GET A BYTE FROM THE UART'
  1544.     DB    CR,LF, '002F    INCH',TAB, 'GET A CHARACTER (ZERO PARITY)'
  1545.     DB    CR,LF, '0032    INHEX',TAB, 'GET A HEX CHAR (CARRY=NONHEX)'
  1546.     DB    CR,LF, '0035    BYTES',TAB, '2 BYTE HEX TO HI/LOBYTE'
  1547.     DB    CR,LF, '0038    BADDR',TAB, 'BUILD ADDRESS'
  1548.     DB    CR,LF, '003B    THRADR',TAB, 'THREE ADDRESSES'
  1549.     DB    CR,LF, '003E    OUT',TAB, 'OUTPUT BYTE IN ACC.'
  1550.     DB    CR,LF, '0041    OUTCH',TAB, 'OUTPUT CHARACTER IN ACC.'
  1551.     DB    CR,LF, '0044    OUTS',TAB, 'OUTPUT SPACE'
  1552.     DB    CR,LF, '0047    OUT2S',TAB, 'OUTPUT 2 SPACES'
  1553.     DB    CR,LF, '004A    CRLF',TAB, 'OUTPUT [CR] AND [LF]'
  1554.     DB    CR,LF, '004D    OUT2H',TAB, 'OUTPUT LOC. POINTED BY R0'
  1555.     DB    CR,LF, '0050    OUTR0',TAB, 'OUTPUT CONTENTS OF R0'
  1556.     DB    CR,LF, '0053    OUTC2HS',TAB, 'OUTPUT PROG. MEM. POINTED'
  1557.     DB    ' BY DPTR, AND SPACE'
  1558.     DB    CR,LF, '0056    PDATA',TAB, 'OUTPUT MESSAGE POINTED BY DPTR'
  1559.     DB    CR,LF, '0059    INC16',TAB, 'INCREMENT 2 BYTE NO.'
  1560.     DB    ' (R0=LOW BYTE)'
  1561.     DB    CR,LF, '005C    DEC16',TAB, 'DECREMENT 2 BYTE NO.'
  1562.     DB    ' (R0+1=HIGH BYTE)'
  1563.     DB    CR,LF, '005F    CPY',TAB, 'BLOCK COPY'
  1564.     DB    CR,LF, '0062    BRKPT',TAB, 'BREAKPOINT ROUTINE'
  1565.     DB    04H
  1566.     END
  1567.